package com.wongoing.sys.action;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.wongoing.base.PageResult;
import com.wongoing.sys.model.SysNotice;
import com.wongoing.sys.service.SysNoticeService;
import com.wongoing.sys.service.SysPostService;
import com.wongoing.sys.viewmodel.JsonResult;
import com.wongoing.util.LogService;
import com.wongoing.util.ModelAndViewConstants;
import com.wongoing.util.PageUtil;
import com.wongoing.util.Status;

@Controller // 调节器
@RequestMapping("/sys/sysNoticeAction") // 请求映射
public class SysNoticeAction extends BaseAction {
	private SysNoticeService service;
	private SysPostService sysPostService;

	@Autowired // 自动装配
	public void setService(SysNoticeService service) {
		this.service = service;
	}

	@Autowired // 自动装配
	public void setPostService(SysPostService sysPostService) {
		this.sysPostService = sysPostService;
	}

	@InitBinder
	protected void init(HttpServletRequest request, ServletRequestDataBinder binder) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		dateFormat.setLenient(false);
		binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
	}
	
	/**
	 * 功能说明： 进入列表展示界面
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:43:54
	 * @param StartDateTime 参数：开始时间
	 * @param EndDateTime 参数：结束时间
	 * @param ContentZH 参数：中文内容
	 * @param ContentEN 参数：英文内容
	 * @param CreateDate 参数：创建时间
	 * @param ModifyDate 参数：修改时间
	 * @param Status 参数：状态
	 * @return
	 */
	@RequestMapping(value = "/toList")
	public ModelAndView toList(Integer StartDateTime, Integer EndDateTime, String ContentZH, String ContentEN,
			String CreateDate, String ModifyDate, String Status) {
		ModelAndView mv = null;
		try {

			PageResult<SysNotice> pageResult = PageUtil.pageSet(this.getClass(), StartDateTime, EndDateTime, ContentZH,
					ContentEN);
			pageResult.getParam().put("status", "0");
			// 模糊查询判断
			List<Boolean> multiFuzzyQuery = new ArrayList<Boolean>(); // multi fuzzy query 是模糊查询的意思 模糊查询开始日期
			if (StartDateTime != null && !"".equals(StartDateTime)) {
				pageResult.getParam().put("StartDateTime", StartDateTime); // 得到参数
				pageResult.setOrderField("cu.StartDateTime"); // 订单字段
				pageResult.setOrderDirection("DESC"); // 订单方向（排序） DESC=降序
				pageResult.getExt().put("paramStartDateTime", StartDateTime); // 得到分机
				multiFuzzyQuery.add(true);
			} else {
				multiFuzzyQuery.add(false);
			}
			if (EndDateTime != null && !"".equals(EndDateTime)) { // 模糊查询结束日期
				pageResult.getParam().put("EndDateTime", EndDateTime);
				pageResult.setOrderField("cu.EndDateTime");
				pageResult.setOrderDirection("DESC");
				pageResult.getExt().put("EndDateTime", EndDateTime);
				multiFuzzyQuery.add(true);
			} else {
				multiFuzzyQuery.add(false);
			}
			if (ContentZH != null && !"".equals(ContentZH)) { // 模糊查询中文公告
				pageResult.getParam().put("ContentZH", ContentZH);
				pageResult.setOrderField("sp.ContentZH");
				pageResult.setOrderDirection("DESC");
				pageResult.getExt().put("ContentZH", ContentZH);
				multiFuzzyQuery.add(true);
			} else {
				multiFuzzyQuery.add(false);
			}
			if (PageUtil.multiFuzzyQuery(multiFuzzyQuery)) {
				pageResult.setOrderField("cu.Id");
				pageResult.setOrderDirection("ASC");
			}
			pageResult = this.service.getNoticeListPageResult(pageResult);
			mv = new ModelAndView();
			mv.addObject(ModelAndViewConstants.PAGE_RESULT, pageResult);
			mv.setViewName(ModelAndViewConstants.NOTICE_MAIN_VIEW);
			LogService.getInstance(this).debug("获取APP用户分页数据成功：" + ModelAndViewConstants.NOTICE_MAIN_VIEW);
		} catch (Exception ex) {
			LogService.getInstance(this).error("获取APP用户分页数据失败：" + ex.getMessage(), ex);
			mv = new ModelAndView(ModelAndViewConstants.ERROR_VIEW);
		}
		return mv;
	}
	/**
	 * 功能说明：执行公告名称验证操作
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:45:19
	 * @param op 操作
	 * @param contentZH 新值
	 * @param original 原值
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/doNoticeNameValidate")
	public Map<String, Object> doNoticeNameValidate(String op, String contentZH, String original) {
		Map<String, Object> jsonResult = null;
		try {
			String where = " BINARY ContentZH='" + contentZH + "' and Status='0' ";
			List<SysNotice> list = this.service.getByWhere(where);
			if (list != null) {
				int count = list.size();
				switch (count) {
				case 0:
					jsonResult = JsonResult.jsonValidateReturn(true, "验证通过，该公告名称可以使用");
					LogService.getInstance(this).debug("公告名称验证通过，可使用");
					break;
				case 1:
					if (ModelAndViewConstants.OPERATION_VALUE_EDIT.equals(op)) {
						if (contentZH.equals(original)) {
							jsonResult = JsonResult.jsonValidateReturn(true, "验证通过，该公告名称可以使用");
							LogService.getInstance(this).debug("公告名称验证通过，可使用");
						} else {
							jsonResult = JsonResult.jsonValidateReturn(false, "该公告名称已被使用");
							LogService.getInstance(this).debug("公告名称已被使用，不可使用");
						}
					} else {
						jsonResult = JsonResult.jsonValidateReturn(false, "该公告名称已被使用");
						LogService.getInstance(this).debug("公告名称已被使用，不可使用");
					}
					break;
				default:
					jsonResult = JsonResult.jsonValidateReturn(false, "该公告名称已被使用");
					LogService.getInstance(this).debug("公告名称已被使用，不可使用");
					break;
				}
			} else {
				jsonResult = JsonResult.jsonValidateReturn(false, "验证失败");
				LogService.getInstance(this).error("公告名称验证失败");
			}
		} catch (Exception e) {
			jsonResult = JsonResult.jsonValidateReturn(false, "验证失败");
			LogService.getInstance(this).error("公告名称验证失败");
		}
		return jsonResult;
	}
	/**
	 * 功能说明：进入添加界面
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:46:08
	 * @return
	 */
	@RequestMapping(value = "/toAdd")
	public ModelAndView toAdd() {
		ModelAndView mv = null;
		try {
			Map<String, Object> param = new HashMap<String, Object>();
			param.put("status", "0");
			mv = new ModelAndView();
			mv.addObject(ModelAndViewConstants.OPERATION_KEY, ModelAndViewConstants.OPERATION_VALUE_ADD);
			mv.addObject(ModelAndViewConstants.TITLE_KEY, "添加公告名称");
			mv.setViewName(ModelAndViewConstants.NOTICE_EDIT_VIEW);
			LogService.getInstance(this).error("新公告添加功能成功：" + ModelAndViewConstants.NOTICE_EDIT_VIEW);
		} catch (Exception ex) {
			LogService.getInstance(this).error("新公告添加失败：" + ex.getMessage(), ex);
			mv = new ModelAndView("redirect:/error.jsp");
		}
		return mv;
	}
	/**
	 * 功能说明：进入编辑界面
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:46:30
	 * @param id
	 * @return
	 */
	@RequestMapping(value = "/toEdit")
	public ModelAndView toEdit(Integer id) {
		ModelAndView mv = null;
		try {
			SysNotice notice = this.service.getByPrimaryKey(id);
			Map<String, Object> param = new HashMap<String, Object>();
			param.put("status", "0");

			mv = new ModelAndView();
			mv.addObject(ModelAndViewConstants.OPERATION_KEY, ModelAndViewConstants.OPERATION_VALUE_EDIT);
			mv.addObject(ModelAndViewConstants.TITLE_KEY, "修改公告");
			mv.addObject(ModelAndViewConstants.NOTICE_MODEL, notice);

			mv.setViewName(ModelAndViewConstants.NOTICE_EDIT_VIEW);
		} catch (Exception ex) {
			LogService.getInstance(this).error("进入公告编辑失败：" + ex.getMessage(), ex);
			mv = new ModelAndView(ModelAndViewConstants.ERROR_VIEW);
		}
		return mv;
	}
	/**
	 * 功能说明：执行保存操作
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:46:50
	 * @param entity
	 * @param op
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/doSave")
	public Map<String, Object> doSave(SysNotice entity, String op) {
		Map<String, Object> jsonResult = null;
		try {
			String tabid = tabid(ModelAndViewConstants.NOTICE_SYS_ID);
			Date now = new Date();
			Subject subject = SecurityUtils.getSubject();
			String noticename = subject.getPrincipal().toString();
			Map<String, Object> param = new HashMap<String, Object>();
			param.put("noticename", noticename);
			if (null == op || ModelAndViewConstants.OPERATION_VALUE_ADD.equals(op)) {
				entity.setStatus(0);
				int count = this.service.insert(entity);
				if (count > 0) {
					LogService.getInstance(this).debug("添加公告成功!");
				}
			} else {
				int count = this.service.updateByPrimaryKey(entity);
				if (count > 0) {
					LogService.getInstance(this).debug("编辑公告成功!");
				}
			}
			Integer statusCode = 200;
			String msg = "公告信息保存成功";
			jsonResult = JsonResult.jsonReturn(statusCode, msg, tabid);
		} catch (Exception ex) {
			LogService.getInstance(this).error("保存公告失败：" + ex.getMessage(), ex);
			String msg = "保存公告失败：" + ex.getMessage();
			jsonResult = JsonResult.jsonReturnErr(msg);
		}
		return jsonResult;
	}
	/**
	 * 功能说明：执行删除操作
	 * 修改说明：
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:47:19
	 * @param id
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/doDel")
	public Map<String, Object> doDel(Integer id) {
		Map<String, Object> result = null;
		try {
			SysNotice entity = new SysNotice();
			entity.setId(id);
			entity.setStatus(1);
			int count = this.service.updateByPrimaryKey(entity);
			if (count > 0) {
				LogService.getInstance(this).debug("删除公告成功!");
			}
			Integer statusCode = 200;
			String msg = "删除成功!";
			String tabid = tabid(ModelAndViewConstants.NOTICE_SYS_ID);
			result = JsonResult.jsonReturn(Status.OK.getCode(), msg, tabid, false, "", "");
		} catch (Exception ex) {
			LogService.getInstance(this).error("删除公告[" + id + "]失败：" + ex.getMessage(), ex);
			String msg = "删除公告[" + id + "]失败：" + ex.getMessage();
			result = JsonResult.jsonReturnErr(msg);
		}
		return result;
	}
}
